package com.langchain4j.core.flow.context;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 节点执行上下文
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NodeContext {
    
    /**
     * 流程执行ID
     */
    private String executionId;
    
    /**
     * 节点ID
     */
    private String nodeId;
    
    /**
     * 输入参数
     */
    private Map<String, Object> inputs;
    
    /**
     * 全局变量
     */
    private Map<String, Object> variables;
    
    /**
     * 节点配置
     */
    private Map<String, Object> config;
    
    /**
     * 执行开始时间
     */
    private LocalDateTime startTime;
    
    /**
     * 执行结束时间
     */
    private LocalDateTime endTime;
    
    /**
     * 是否调试模式
     */
    private Boolean debug;
    
    /**
     * 日志记录器
     */
    private FlowLogger logger;
    
    /**
     * 创建新的上下文
     */
    public static NodeContext create(String executionId, String nodeId, Map<String, Object> inputs) {
        return NodeContext.builder()
                .executionId(executionId)
                .nodeId(nodeId)
                .inputs(inputs != null ? inputs : Map.of())
                .variables(new ConcurrentHashMap<>())
                .startTime(LocalDateTime.now())
                .debug(false)
                .build();
    }
    
    /**
     * 获取输入参数
     */
    public Object getInput(String key) {
        return inputs.get(key);
    }
    
    /**
     * 获取输入参数（带默认值）
     */
    public Object getInput(String key, Object defaultValue) {
        return inputs.getOrDefault(key, defaultValue);
    }
    
    /**
     * 设置全局变量
     */
    public void setVariable(String key, Object value) {
        if (variables == null) {
            variables = new ConcurrentHashMap<>();
        }
        variables.put(key, value);
    }
    
    /**
     * 获取全局变量
     */
    public Object getVariable(String key) {
        return variables != null ? variables.get(key) : null;
    }
    
    /**
     * 获取全局变量（带默认值）
     */
    public Object getVariable(String key, Object defaultValue) {
        return variables != null ? variables.getOrDefault(key, defaultValue) : defaultValue;
    }
    
    /**
     * 记录日志
     */
    public void log(String message) {
        if (logger != null) {
            logger.log(executionId, nodeId, message);
        }
    }
    
    /**
     * 记录错误日志
     */
    public void logError(String message, Throwable error) {
        if (logger != null) {
            logger.logError(executionId, nodeId, message, error);
        }
    }
} 